Personal computer systems are well known in the art. They have attained widespread use for providing computer power to many segments of today's modem society. Personal computers (PCs) may be defined as a desktop, floor standing, or portable microcomputer that includes a system unit having a central processing unit (CPU) and associated volatile and non-volatile memory, including random access memory (RAM) and basic input/output system read only memory (BIOS ROM), a system monitor, a keyboard, one or more flexible diskette drives, a CD-ROM or DVD-ROM drive, a fixed disk storage drive (also known as a “hard drive”), a pointing device such as a mouse, and an optional network interface adapter. One of the distinguishing characteristics of these systems is the use of a motherboard or system planar to electrically connect these components together. The use of mobile computing devices, such as notebook PCs, personal digital assistants (PDAs), sophisticated wireless phones, etc., has also become widespread. The widespread use of PCs and mobile computing devices in various segments of society has resulted in a reliance on computer systems both at work and at home, such as for telecommuting, news, stock market information and trading, banking, shopping, shipping, communication in the form of hypertext transfer protocol (http) and e-mail, as well as other services. Many of these functions take advantage of the communication abilities offered by the Internet or other networks, such as local area networks.
As software used with PCs and mobile computer devices is used for more and more functions and increases in utility, it has become increasingly complex. Because of the complexity of modern operating systems and software applications, users are often unable to diagnose problems, or defects, in their software. When a problem with their software occurs, users typically do not know what caused the problem or how it can be fixed and are instead presented with a cryptic error message at best. Even when the user identifies a potential software defect, the user typically cannot effectively inform interested parties of a potential software defect. Users similarly cannot efficiently verify that the potential defect is an actual defect, inform others of the prevalence of the defect, or provide sufficient information to recreate or diagnose the defect. Many software defects accordingly go unreported and are not diagnosed in a timely fashion.
One solution to the problem of software defects is for the software application under use to have a handler for when it reaches a particular failing state that results in termination of execution of the software. These software applications transmit a notification of the state to the creator of the software application when the software reaches the handler, if the user agrees to the transmittal. Such a solution, however, has a number of drawbacks. First, this solution does not capture a complete failing state of the operating system (OS) on which the software is executing, instead providing information only when the application itself reaches a particular point. The failing state of the OS prevents the proper operation of the handler. The solution also fails to allow a user to voluntarily submit a state or potential defect (that does not satisfy the handler) to verify whether it is an actual defect. In addition, the solution only handles states that cause the application to terminate in a particular way, failing to handle other states that do not trigger the handler. Moreover, this solution fails to recognize the role played by multiple, interacting applications that may cause errors as a result of their interaction. There is, therefore, a need for an efficient and effective system to manage software defects.